// 给定一个含有 n 个正整数的数组和一个正整数 s ，
// 找出该数组中满足其和 ≥ s 的长度最小的连续子数组，并返回其长度。如果不存在符合条件的连续子数组，返回 0。

function minSubArrayLen(s: number, nums: number[]): number {
    let length: number = nums.length + 1;// 初始化数组长度变量
    let sum: number = 0;// 初始化子数组和
    let leftBound: number = 0;// 初始化滑动窗口左边界
    let rightBound: number = 0;// 右边界
    // 滑动窗口算法
    while (rightBound < nums.length) {
        // 窗口向右滑动扩大
        sum += nums[rightBound];
        rightBound++;
        // 窗口向左滑动缩小 同时更新子数组和与长度变量
        while (sum >= s) {
            length = Math.min(length, rightBound - leftBound)
            sum -= nums[leftBound];
            leftBound++;
        }
    }
    // 最后判断length变量是否有更新过
    return length === nums.length + 1 ? 0 : length;
};

// 这道题目考察的又是一个连续子数组是否符合需要条件的问题
// 故我们可以使用滑动窗口算法来求解这类问题。
// 定义两个指针 lB 和 rB 分别表示子数组的开始位置和结束位置
// 然后维护变量 sum 存储子数组中的元素和，length表示数组长度
// 这里注意初始的状态下
// 我们赋值滑动窗口指针均为0，sum的值也为0，length给一个不可能的nums.length + 1
// 进行while循环，在每一轮的迭代下，我们将窗口向右滑动扩大，更新长度和子数组和
// 当子数组和大于s的时候，进入次循环，窗口向左滑动缩小
// 在此过程中同样更新子数组的最小长度
// 最后判断length变量是否有更新过就可以判断是否需要返回0
